#pragma once
#include <pthread.h>
#include <iostream>
#include <string>
#include <functional>
#include <cassert>

class Thread
{
    typedef std::function<void*(void*)> func_t;  //用c++11中的function包装器接收方法
private:
    static void* start_routine(void* args)      //只能是静态成员的原因
    {
        Thread* t = static_cast<Thread*>(args);
        return t->callback();
    } 

public:
    Thread()        //创建时先只给线程名字，等正式要用时再创建线程
    {
        char namebuff[128];
        snprintf(namebuff,sizeof(namebuff),"Thread[%d]",ThreadNum++);
        _name = namebuff;
    }

    void Run(func_t func,void* args)
    {
        _func = func;
        _args = args;
        int n = pthread_create(&_tid,nullptr,start_routine,this);     //传this指针的原因    
    }

    void Join()
    {
        pthread_join(_tid,nullptr);
    }

    std::string ThreadName()  //获取当前线程名字
    {
        return _name;
    }

    void* callback()
    {
        return _func(_args);
    }

private:
    std::string _name;      //线程名字
    pthread_t _tid;
    void* _args;   
    func_t _func;     //线程执行的方法

    static int ThreadNum;
};

int Thread::ThreadNum = 1;


